package work.linruchang.util.bean.wrapper;

import work.linruchang.util.other.SFunction;

/**
 * 条件构建器
 *
 * @param <MasterTable>
 * @param <T>
 */
public interface WhereWrapper<MasterTable, T extends BaseWrapper> extends BaseWrapper<MasterTable, Object> {

    /**
     * 表字段值必须有值
     *
     * @param dbFieldName 主表的字段
     * @return
     */
    T notEmptyFieldValue(String dbFieldName);

    T notEmptyFieldValue(Class tableClazz, String dbFieldName);

    T notEmptyFieldValue(boolean condition, Class tableClazz, String dbFieldName);

    /**
     * 表字段值必须为空
     *
     * @param dbFieldName 主表的字段
     * @return
     */
    T emptyFieldValue(String dbFieldName);

    T emptyFieldValue(Class tableClazz, String dbFieldName);

    T emptyFieldValue(boolean condition, Class tableClazz, String dbFieldName);


    /**
     * =
     *
     * @param dbFieldName 主表的字段
     * @param value       字段值
     * @return
     */
    T eq(SFunction<MasterTable, ?> dbFieldName, Object value);

    T eq(String dbFieldName, Object value);

    T eq(Class tableClazz, String dbFieldName, Object value);

    T eq(boolean condition, Class tableClazz, String dbFieldName, Object value);


    /**
     * =
     * 如果Value为空值则直接忽略此条件构建
     *
     * @param dbFieldName 主表的字段
     * @param value       字段值
     * @return
     */
    T eqIgnoreEmptyValue(String dbFieldName, Object value);

    T eqIgnoreEmptyValue(Class tableClazz, String dbFieldName, Object value);

    /**
     * <=
     *
     * @param dbFieldName
     * @param value
     * @return
     */
    T le(String dbFieldName, Object value);

    T le(Class tableClazz, String dbFieldName, Object value);

    T le(boolean condition, Class tableClazz, String dbFieldName, Object value);

    /**
     * <=
     * 如果Value为空值则直接忽略此条件构建
     *
     * @param dbFieldName 主表的字段
     * @param value       字段值
     * @return
     */
    T leIgnoreEmptyValue(String dbFieldName, Object value);

    T leIgnoreEmptyValue(Class tableClazz, String dbFieldName, Object value);

    /**
     * >=
     *
     * @param dbFieldName
     * @param value
     * @return
     */
    T ge(String dbFieldName, Object value);

    T ge(Class tableClazz, String dbFieldName, Object value);

    T ge(boolean condition, Class tableClazz, String dbFieldName, Object value);

    /**
     * >=
     * 如果Value为空值则直接忽略此条件构建
     *
     * @param dbFieldName 主表的字段
     * @param value       字段值
     * @return
     */
    T geIgnoreEmptyValue(String dbFieldName, Object value);

    T geIgnoreEmptyValue(Class tableClazz, String dbFieldName, Object value);

    /**
     * <
     *
     * @param dbFieldName
     * @param value
     * @return
     */
    T lt(String dbFieldName, Object value);

    T lt(Class tableClazz, String dbFieldName, Object value);

    T lt(boolean condition, Class tableClazz, String dbFieldName, Object value);

    /**
     * <
     * 如果Value为空值则直接忽略此条件构建
     *
     * @param dbFieldName 主表的字段
     * @param value       字段值
     * @return
     */
    T ltIgnoreEmptyValue(String dbFieldName, Object value);

    T ltIgnoreEmptyValue(Class tableClazz, String dbFieldName, Object value);

    /**
     * >
     *
     * @param dbFieldName
     * @param value
     * @return
     */
    T gt(String dbFieldName, Object value);

    T gt(Class tableClazz, String dbFieldName, Object value);

    T gt(boolean condition, Class tableClazz, String dbFieldName, Object value);

    /**
     * >
     * 如果Value为空值则直接忽略此条件构建
     *
     * @param dbFieldName 主表的字段
     * @param value       字段值
     * @return
     */
    T gtIgnoreEmptyValue(String dbFieldName, Object value);

    T gtIgnoreEmptyValue(Class tableClazz, String dbFieldName, Object value);

    /**
     * in
     *
     * @param dbFieldName
     * @param value
     * @return
     */
    T in(String dbFieldName, Object value);

    T in(Class tableClazz, String dbFieldName, Object value);

    T in(boolean condition, Class tableClazz, String dbFieldName, Object value);

    /**
     * in
     * 如果Value为空值则直接忽略此条件构建
     *
     * @param dbFieldName 主表的字段
     * @param value       字段值
     * @return
     */
    T inIgnoreEmptyValue(String dbFieldName, Object value);

    T inIgnoreEmptyValue(Class tableClazz, String dbFieldName, Object value);

    /**
     * not In
     *
     * @param dbFieldName
     * @param value
     * @return
     */
    T notIn(String dbFieldName, Object value);

    T notIn(Class tableClazz, String dbFieldName, Object value);

    T notIn(boolean condition, Class tableClazz, String dbFieldName, Object value);

    /**
     * not In
     * 如果Value为空值则直接忽略此条件构建
     *
     * @param dbFieldName 主表的字段
     * @param value       字段值
     * @return
     */
    T notInIgnoreEmptyValue(String dbFieldName, Object value);

    T notInIgnoreEmptyValue(Class tableClazz, String dbFieldName, Object value);

    /**
     * BETWEEN ? AND ?
     *
     * @param dbFieldName
     * @param value1
     * @param value2
     * @return
     */
    T betweenAnd(String dbFieldName, Object value1, Object value2);

    T betweenAnd(Class tableClazz, String dbFieldName, Object value1, Object value2);

    T betweenAnd(boolean condition, Class tableClazz, String dbFieldName, Object value1, Object value2);

    /**
     * not In
     * 如果Value为空值则直接忽略此条件构建
     *
     * @param dbFieldName 主表的字段
     * @param value       字段值1
     * @param value       字段值2
     * @return
     */
    T betweenAndIgnoreEmptyValue(String dbFieldName, Object value, Object value2);

    T betweenAndIgnoreEmptyValue(Class tableClazz, String dbFieldName, Object value, Object value2);

    /**
     * like '%值%'
     *
     * @param dbFieldName
     * @param value1
     * @return
     */
    T like(String dbFieldName, Object value1);

    T like(Class tableClazz, String dbFieldName, Object value1);

    T like(boolean condition, Class tableClazz, String dbFieldName, Object value);

    /**
     * like '%值%'
     * 如果Value为空值则直接忽略此条件构建
     *
     * @param dbFieldName 主表的字段
     * @param value       字段值
     * @return
     */
    T likeIgnoreEmptyValue(String dbFieldName, Object value);

    T likeIgnoreEmptyValue(Class tableClazz, String dbFieldName, Object value);

    /**
     * like '%值'
     *
     * @param dbFieldName
     * @param value1
     * @return
     */
    T likeLeft(String dbFieldName, Object value1);

    T likeLeft(Class tableClazz, String dbFieldName, Object value1);

    T likeLeft(boolean condition, Class tableClazz, String dbFieldName, Object value);

    /**
     * like '%值'
     * 如果Value为空值则直接忽略此条件构建
     *
     * @param dbFieldName 主表的字段
     * @param value       字段值
     * @return
     */
    T likeLeftIgnoreEmptyValue(String dbFieldName, Object value);

    T likeLeftIgnoreEmptyValue(Class tableClazz, String dbFieldName, Object value);

    /**
     * like '值%'
     *
     * @param dbFieldName
     * @param value1
     * @return
     */
    T likeRight(String dbFieldName, Object value1);

    T likeRight(Class tableClazz, String dbFieldName, Object value1);

    T likeRight(boolean condition, Class tableClazz, String dbFieldName, Object value);

    /**
     * like '值%'
     * 如果Value为空值则直接忽略此条件构建
     *
     * @param dbFieldName 主表的字段
     * @param value       字段值
     * @return
     */
    T likeRightIgnoreEmptyValue(String dbFieldName, Object value);

    T likeRightIgnoreEmptyValue(Class tableClazz, String dbFieldName, Object value);
}
